Date : 7 ET 8 NOVEMBRE 1991
Protection : MOT DE PASSE
Programme : GREAT COURTS II
Outils : SOFT-ICE V2.50
Fichier : VGA.DAT + GC2FS.COM
Temps pass� : 1 HEURE 30
Soci�t� : UBI SOFT
Divers : O� je me fais avoir en beaut�.
Origine : ?
Num�ro : 148
Une demande de mot de passe qui est constamment renouvel�e tant que
l'on n'a pas entr� les quatre bons caract�res.
�a peut durer longtemps.
Les caract�res sont demand�s par l'interm�diaire de l'INT 16 sous-
fonction 00.
En bricolant un peu par ci par l� on trouve un RET que le soft ignore
superbement s'acharnant � vouloir passer ailleurs.
Je le force ( premier patch ) ce qui me fait tomber sur quelque chose
de connu, une position m�moire que l'on remet � z�ro dans un cas et
pas dans l'autre: ( c'est du flair c'est tout )
CS=0FF5
CS:4933 E86100 CALL 4997
CS:4936 0BC0 OR AX,AX
CS:4938 7807 JS 4941 ; SAUTE SI MAUVAISE REPONSE.
CS:493A C70619250000 MOV WORD PTR [2519],0000
CS:4940 C3 RET
En pla�ant deux NOP � la place du JS 4941 le jeu tourne. ( de plus
aucun fichier n'est crypt� et l'on trouve toutes ces cha�nes dans
le fichier VGA.DAT ).
Voil� me direz-vous il ne suffit plus que de faire un patch pour le
premier saut rencontrer au d�but.
Et c'est l� que cela se corse car en modifiant le saut en question
le jeu se trouve �tre pris de folie en clignotant d'un menu � l'autre !
Le saut en question suit une instruction TEST de la position 2B6D avec
FF. Comme j'ai toujours z�ro en 2B6D mon JNZ qui suit s'ex�cute mal.
( c'est le moins que l'on puisse dire ).
De plus je m'aper�ois avec SOFT-ICE que je repasse par ce saut plus
tard une fois la demande du code pass�e ce qui explique que mon
programme ne se d�roule plus correctement.
Ci-dessous la routine en question:
CS=0FF5
CS:6674 E83C09 CALL 6FB3
CS:6677 F6066D2BFFF TEST BYTE PTR [2B6D],FF
CS:667C 752A JNZ 66A8 ; SAUT FATIDIQUE....
ACTIONS ET RESULTATS:
INVERSION DU SAUT JNZ 66A8 EN JZ 66A8.............. --> JEU SE PLANTE.
INVERSION DU FLAG Z................................ --> IDEM.
ECRITURE D'UNE VALEUR DIFFERENTE DE ZERO EN [2B6D]. --> CA MARCHE.
REMPLACER L'INSTRUCTION TEST PAR < MOV [2B6D],FF >. --> CA PLANTE.
L'id�e vient d'essayer de trouver � quel moment le programme �crit 00
en [2B6D] et de modifier l'instruction. ( �a c'est g�nial )
Premi�re constatation : le programme de test du code n'�crit JAMAIS
dans cette position !
Donc - restons calme - c'est que cette position est initialis�e au
chargement du jeu, cela signifie ( avec un peu de chance ) que SOFT-
ICE devrait me trouver l'instruction ( ou la boucle ) qui �crit � cet
endroit.
Un point d'arr�t du type < BPMB 1E69:2B6D W > est pos�.
Pourquoi 1E69 ? Parceque DS est �gal � cette valeur au moment de
l'appel tout simplement.
Je relance tout et SOFT-ICE s'affiche imm�diatement. Je me trouve dans
une boucle qui me remet toute la zone m�moire autour de 2B6D � z�ro
� l'aide d'une instruction INSW. Las, cela ne figure donc pas dans le
fichier, c'aurait �t� trop simple.
INSW avez-vous dit ?
Dans ce cas rien est perdu car c'est une instruction 80286/80386.
Cela signifie que je me trouve dans le BIOS et que le programme n'est
pas encore charg�. Car il faut savoir que les auteurs de logiciel sont
obliger de programmer en utilisant le jeu d'instructions du PC XT
autrement dit du 8088 pour que le jeu tourne sur toute les machines.
( compatibilit� ascendante )
Je relance donc SOFT-ICE par x et cette fois ci je m'arr�te dans mon
programme avec une superbe instruction MOV BYTE PTR [2B6D],00.
Je m'empresse de la transformer en MOV BYTE PTR [2B6D],01 et je relance
mon soft... qui se plante toujours !
Avec SOFT-ICE je contr�le le contenu de la position 2B6D qui est �gale
� ZERO ! Que signifie-ce ?
Je place des points d'arr�ts partout pour pouvoir suivre le contenu de
2B6D et je m'aper�ois que le programme au niveau de la demande du code
r��crit ZERO dans cette position: c'est � devenir fou.
J'en ai marre: j'applique la soluce muscl�e c.a.d. d�tournement d'INT
par un programme p�re. Le d�tournement d'INT en TSR me pose trop de
probl�mes.
Un point d'arr�t sur l'INT 16 sous-fonction 00 est plac� pour s'assurer
que cette interruption n'est appel�e qu'� l'endroit de la demande du
code et nul part ailleurs.
Et on modifie un de mes pr�c�dents PATCH.ASM:
; PATCH POUR LE PROGRAMME GREAT COURTS II.
; DETOURNEMENT DE L'INT 16 SOUS-FONCTION 00.
; Il s'agit juste de mettre quelque chose dans la position m�moire 2B6D.
; 8 NOVEMBRE 1991.
adr_ip equ 2b6dh
seg_a segment byte public
assume cs:seg_a, ds:seg_a, es:seg_a, ss:seg_a
org 100h
sto proc far
start:
jmp init ; r�duire la m�moire et d�placer la
db 90h ; pile plus pr�s.
nom_prg db 'gc2.exe',0,0,0,0,0,0 ; 12 car max + nul
paramet dw 0 ; M�me bloc d'environnement.
ENVIR dw 0 ; Les param�tres de la ligne de
data_3 dw 0 ; commande sont recopi�s ici puis
FCB_1 dw 0 ; transmis au programme fils. ( 80h )
data_5 dw 0 ; "LOAD /U EGA 1"
FCB_2 dw 0
data_7 dw 0
sauve_SP dw 0
sauve_SS dw 0
data_9 dw 0, 0
drap equ 0
;------------------------------ PROGRAMME PERE ------------------------------
loc_1: mov sauve_SP,sp
mov sauve_SS,ss
mov ax,80h
mov ENVIR,ax ; Ligne de commande...
mov data_3,ds
mov ax,5Ch ; Premier FCB ( inutilis� )
mov FCB_1,ax
mov data_5,ds
mov ax,6Ch ; Second FCB ( inutilis� )
mov FCB_2,ax
mov data_7,ds
mov ah,35h
mov al,16h
int 21h ; DOS Services ah=function 35h
; get intrpt vector al in es:bx
mov cs:data_9,bx
mov word ptr cs:data_9+2,es
mov ah,25h
mov al,16h
lea dx,cs:[int16] ; Load effective addr
int 21h ; DOS Services ah=function 25h
; set intrpt vector al to ds:dx
lea dx,cs:[nom_prg] ; Load effective addr
push ds
pop es
lea bx,cs:[paramet] ; Load effective addr
mov al,0
mov ah,4Bh
int 21h ; Appel du programme fils.
; run progm @ds:dx, parm @es:bx
mov sp,sauve_SP
mov ss,sauve_SS
mov ah,25h
mov al,16h
mov dx,cs:data_9
mov ds,word ptr cs:data_9+2
int 21h ; set intrpt vector al to ds:dx
mov ah,4dh
int 21h
mov ah,4Ch
int 21h ; terminate with al=return code
sto endp
;---------------------------- int 16 d�tourn�e -----------------------------
int_16h_entry proc far
int16: push ax
push ds
push bp
push cx
pushf
cmp byte ptr ds:[drap],1 ; Je regarde si c'est fait.
jz loc_2
cmp ah,0 ; Sous- fonction 00
jne loc_2 ; Jump if not equal
mov byte ptr ds:[adr_ip],1 ; on place '1' dans DS:2B6D
mov byte ptr ds:[drap],1 ; On y revient plus.
loc_2: popf
pop cx
pop bp
pop ds
pop ax
jmp dword ptr cs:data_9
int_16h_entry endp
;------------ REDUCTION DE LA PLACE OCCUPEE PAR LE PROGRAMME COM ------------
init: mov ah,4ah
mov bx,offset fin ; Fin du programme en BX.
mov cl,4 ; Divis� par 4 pour avoir des paragraphes.
shr bx,cl
inc bx ; On en rajoute un par s�curit�.
int 21h ; Execution de la fonction 4Ah.
mov sp,offset fin ; on d�place la pile en "fin" car elle est
jmp loc_1 ; plac�e en FFFE dans un programme COM.
fin_init label near
;----------------------- PLACE RESERVEE POUR LA PILE ------------------------
dw (256-((fin_init-init) shr 1)) dup (?)
fin equ this byte ; ici le sommet de la pile, SP
db 35 dup (?)
db 'Please no more codewheel nor password, why bother ?'
db 125 dup (?)
db 'FREDDY_SOFT'
seg_a ends
end start
17 Novembre 1991
Ou je m'aper�ois en lan�ant le soft sans la routine de d�tournement
que l'on peut passer le code simplement en tapant ESC !
Mais la seconde modification est obligatoire: avec PCTOOLS chercher
0BC07807 et modifier 7807 par 9090.
30 septembre 1992
O� pr�s d'un an apr�s pensant avoir perdu ce DEP je le recraque pour
d�couvrir des choses que je n'avais pas vu la premi�re fois. Et comble
de tout je n'avais pas perdu ce DEP c'est CGII.DEP que j'ai du �cras�
et non celui-ci: GCII.DEP !
Me faisant toujours pi�ger par le fait que j'oublie que c'est la touche
ESC qui fait sortir de la routine de test, je d�cortique tout en
d�cidant de suivre le chemin par o� l'on fait passer les caract�res
tap�s � l'�cran.
Ayant trouv� l'endroit o� ils sont stock�s j'y place un point d'arr�t
en lecture ( car il va bien falloir venir les relire pour les comparer
� la bonne r�ponse ) et je lance la machine.
BMPB 33D4:0075 R
SOFT-ICE r�apparait imm�diatement avec la s�quence suivante:
CS=0E02
CS:49DB 800441 ADD BYTE PTR [SI],41
CS:49DE A6 CMPSB
CS:49DF 750A JNZ 49EB ; SI MAUVAIS ON SAUTE ET FFFF -> AX.
CS:49E1 E2F8 LOOP 49DB ; TANT QUE C'EST BON ON TOURNE.
CS:49E3 B80000 MOV AX,0000 ; SI OK 0000 -> AX.
CS:49E6 07 POP ES
CS:49E7 1F POP DS
CS:49E8 5F POP DI
CS:49E9 5E POP SI
CS:49EA C3 RET ; ON S'EN VA AVEC LA BONNE REPONSE.
CS:49EB B8FFFF MOV AX,FFFF ; MAUVAISE REPONSE.
CS:49EE 07 POP ES
CS:49EF 1F POP DS
CS:49F0 5F POP DI
CS:49F1 5E POP SI
CS:49F2 C3 RET ; RETOUR AVEC LA MAUVAISE REPONSE.
Donc on voit qu'il suffit de placer 0000 dans AX avant de quitter par
le RET.
Et en passant le RET on se retrouve apr�s le CALL 6631 qui lui en fait
demande le mot de passe:
CS=0E02
CS:492A C706AD2B5449 MOV WORD PTR [2BAD],4954
CS:4930 E8FE1C CALL 6631 ; Demande du mot de passe.
CS:4933 E86100 CALL 4997 ; Comparaison de la chaine de caract�res
CS:4936 0BC0 OR AX,AX ; Test ( 0000 ou FFFF dans AX du CALL ).
CS:4938 7807 JS 4941 ; SAUT FATIDIQUE....
En suprimant le CALL de la demande du mot de passe ainsi que celui du
test plus les deux instructions qui suivent on ne voit plus une seule
trace de la demande du mot de passe en lan�ant le jeu. Et surtout,
surtout on ne risque plus d'oublier que c'est la touche ESC qui valide
le code tap� !
Avec PCTOOLS chercher E8FE1CE861000BC07807 dans le fichier VGA.DAT et
remplacer le tout par des 90.
FREDDY
|